NOTE
1.14 MySQL bin-log
1. bin-log是什么 - MySQL Server层的日志,用于日志归档 - 记录了对于数据库的变更操作,不包括查询操作。 2. 为什么有了redo-log还需要bin-log - redo-log是InnoDB存储引擎的,而bin-log是MySQL Server层面的 3. bin-log
这是历史学习笔记,可能存在过时或不完整的理解。
1. bin-log是什么
- MySQL Server层的日志,用于日志归档
- 记录了对于数据库的变更操作,不包括查询操作。
2. 为什么有了redo-log还需要bin-log
- redo-log是InnoDB存储引擎的,而bin-log是MySQL Server层面的
3. bin-log作用
3.1. 备份恢复
- 一般MySQL整库和bin-log都会定时备份
- 找到整库最近的一次全量备份
- 从备份的时间点开始,将备份的binlog依次取出来,重放
3.2. 主从复制
4. bin-log文件位置
- 默认放置在数据目录下
- 命名方式:mysql-bin.000001
5. bin-log格式
5.1. statement格式
- 记原始的SQL语句,比如insert/delete/update
- 问题:
- 可能导致主备不一致。比如current_time,在主库中是时间A,到了备库就是时间B了
5.2. row格式
- 哪条记录被修改,修改前和修改后的值是什么
- 对于行插入,日志记录相关列的新值
- 对于行删除,日志表识这一行被删除
- 对于行更新,日志记录所有列的的新值
- 问题:
- 占用空间大。比如删除10000条数据,如果是statement的话那么只需要
delete from t where id in (xxx),而如果是row的话那么需要记录10000条数据被删除
- 占用空间大。比如删除10000条数据,如果是statement的话那么只需要
5.3. mixed格式
- 以上两种的混合,对于可能导致主从不一致的MySQL会使用row,否则使用statement
5.4. bin log格式选型
- 大多数选用row,因为它记录了完整的信息,可以用于恢复数据
6. bin-log写入机制

- 事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中
- write 和fsync的时机,是由参数sync_binlog控制的:
- sync_binlog=0的时候,表示每次提交事务都只write,不fsync
- sync_binlog=1的时候,表示每次提交事务都会执行write+fsync
- 为了安全一般采用这个
- sync_binlog=N(N>1)的时候,表示每次提交事务都write,但累积N个事务后才fsync